package br.com.ff.veiculo.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.com.ff.cliente.entidade.Cliente;
import br.com.ff.commons.dao.BaseDAOImpl;
import br.com.ff.tipoveiculo.entidade.TipoVeiculo;
import br.com.ff.veiculo.entidade.Veiculo;

public class VeiculoDAOImpl extends BaseDAOImpl implements VeiculoDAO {

	public VeiculoDAOImpl(EntityManager entityManager) {
		super(entityManager);
	}

	@Override
	public List<Veiculo> findByParams(Veiculo veiculo) {
		String placa = veiculo.getPlaca();
		String descricao = veiculo.getDescricao();
		TipoVeiculo tipoVeiculo = veiculo.getTipoVeiculo();
		Cliente cliente = veiculo.getCliente();		
		int status = -1; 
				
		if (veiculo.getStatus() > 0) {
			status = veiculo.getStatus();
		}
		
		String queryStr = "SELECT object(o) FROM Veiculo o ";
		
		if ((placa != null && !placa.equals(""))
				|| (descricao != null && !descricao.equals(""))
				|| (tipoVeiculo != null)
				|| (cliente != null)
				|| status > -1) {
			queryStr += "WHERE ";
		}
		
		boolean placaFlag = false;
		if (placa != null && !placa.equals("")) {
			queryStr += " o.placa LIKE :placaP ";
			placaFlag = true;
		}
		
		boolean tipoVeiculoFlag = false;
		if (tipoVeiculo != null) {
			if (placaFlag) {
				queryStr += " AND ";
			}
			queryStr += " o.tipoVeiculo = :tipoVeiculoP ";
			tipoVeiculoFlag = true;
		}
		
		boolean clienteFlag = false;
		if (cliente != null) {
			if (tipoVeiculoFlag) {
				queryStr += " AND ";
			}
			queryStr += " o.cliente = :clienteP ";
			clienteFlag = true;
		}
		
		boolean descricaoFlag = false;
		if (descricao != null && !descricao.equals("")) {
			if (tipoVeiculoFlag) {
				queryStr += " AND ";
			}
			queryStr += " o.descricao LIKE :descricaoP ";
			descricaoFlag = true;
		}
		
		boolean statusFlag = false;
		if (status > -1) {
			if (descricaoFlag) {
				queryStr += " AND ";
			}
			queryStr += " o.status = :statusP ";
			statusFlag = true;
		}
		
		Query query = getEntityManager().createQuery(queryStr);
		
		if (placaFlag) {
			query.setParameter("placaP", placa+"%");
		}
		if (tipoVeiculoFlag) {
			query.setParameter("tipoVeiculoP", tipoVeiculo);
		}
		if (clienteFlag) {
			query.setParameter("clienteP", cliente);
		}
		if (descricaoFlag) {
			query.setParameter("descricaoP", descricao+"%");
		}
		if (statusFlag) {
			query.setParameter("statusP", status);
		}
		
		return query.getResultList();
	}

	@Override
	public List<Veiculo> findVeiculoPorSerial(String serial) {
		Query query = getEntityManager().createNamedQuery("findVeiculoPorSerial");
		query.setParameter("pSerial", serial);
		return query.getResultList();
	}
	
}
